package com.clay.appointment.exception;

/**
 * <p>
 * 全局异常
 * </p>
 *
 * @author clay
 * @since 2021/7/21
 */
public class GlobalException extends RuntimeException {
    private Integer code;

    /**
     * 私有全参构造
     *
     * @param code    状态码
     * @param message 信息
     */
    private GlobalException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    /**
     * 通过异常枚举值构建异常
     *
     * @param exceptionEnum 异常枚举
     */
    private GlobalException(ExceptionEnum exceptionEnum) {
        super(exceptionEnum.getMessage());
        this.code = exceptionEnum.getCode();
    }

    public static void throwOut() {
        throwOut(ExceptionEnum.UNDEFINED);
    }

    /**
     * 获取状态码
     *
     * @return 状态码
     */
    public Integer getCode() {
        return code;
    }

    /**
     * 通过异常枚举抛出异常
     *
     * @param exceptionEnum 异常枚举
     */
    public static void throwOut(ExceptionEnum exceptionEnum) {
        throw new GlobalException(exceptionEnum);
    }

    /**
     * 通过异常状态、信息抛出异常
     *
     * @param code    状态码
     * @param message 状态信息
     */
    public static void throwOut(Integer code, String message) {
        throw new GlobalException(code, message);
    }

    /**
     * 通过异常信息抛出异常
     * 采用503状态码
     *
     * @param message 状态信息
     */
    public static void throwOut(String message) {
        throw new GlobalException(ExceptionEnum.UNDEFINED.getCode(), message);
    }
}